#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
AI营销方案生成系统 - 需求模型
提供营销需求的数据模型和数据访问对象

主要功能：
- 营销需求数据模型
- 需求验证和序列化
- 需求数据访问对象
- 需求管理操作

设计原则：
- 灵活性：支持动态需求字段
- 可追溯性：记录需求处理过程
- 数据完整性：确保需求数据一致性
- 性能优化：合理使用索引

Author: AI Marketing System
Date: 2024
"""

from typing import Dict, Any, List, Optional
from datetime import datetime, timezone
from pymongo.database import Database
from pymongo import ASCENDING, DESCENDING, TEXT
from enum import Enum

from .base import BaseModel, BaseDAO


class RequirementStatus(Enum):
    """
    需求状态枚举
    """
    PENDING = 'pending'          # 待处理
    PROCESSING = 'processing'    # 处理中
    COMPLETED = 'completed'      # 已完成
    FAILED = 'failed'           # 处理失败
    CANCELLED = 'cancelled'      # 已取消


class Requirement(BaseModel):
    """
    营销需求模型
    
    字段说明：
    - requirement_content: 需求内容
    - template_id: 使用的模板ID
    """
    
    collection_name = 'requirements'
    
    required_fields = [
        'requirement_content',
        'template_id'
    ]
    
    optional_fields = []
    
    default_values = {}
    
    def _custom_validate(self) -> List[str]:
        """
        自定义验证逻辑
        
        Returns:
            List[str]: 错误列表
        """
        errors = []
        
        # 验证需求内容
        if hasattr(self, 'requirement_content') and self.requirement_content:
            if len(self.requirement_content.strip()) < 1:
                errors.append("需求内容不能为空")
        
        # 验证模板ID
        if hasattr(self, 'template_id') and self.template_id:
            from bson import ObjectId
            try:
                if isinstance(self.template_id, str):
                    ObjectId(self.template_id)
            except Exception:
                errors.append("模板ID格式无效")
        
        return errors
    
    # 移除了复杂的状态管理方法，保持简单的数据模型
    
    # 移除了复杂的表单字段和元数据管理方法，保持简单的数据模型
    
    @classmethod
    def create_indexes(cls, db: Database):
        """
        创建索引
        
        Args:
            db: 数据库实例
        """
        collection = db[cls.collection_name]
        
        # 创建基础索引
        indexes = [
            # 模板ID索引
            [('template_id', ASCENDING)],
            # 创建时间索引
            [('created_at', DESCENDING)]
        ]
        
        for index in indexes:
            try:
                collection.create_index(index)
            except Exception as e:
                print(f"创建索引失败 {index}: {e}")


class RequirementDAO(BaseDAO):
    """
    营销需求数据访问对象
    
    提供需求相关的数据库操作：
    - 需求CRUD操作
    - 需求查询和筛选
    - 需求统计和分析
    """
    
    @property
    def collection_name(self) -> str:
        return 'requirements'
    
    @property
    def model_class(self):
        return Requirement
    
    # 移除了复杂的查询和统计方法，保持简单的数据访问
    # 只保留基础的CRUD操作，符合文档要求的简单功能